package handler

import (
	"github.com/APP/internal/models"
	"github.com/APP/internal/service/system_service"
	code "github.com/APP/pkg/response"
	"github.com/gin-gonic/gin"
	"strconv"
)

type PermissionHandler struct {
	permissionService system_service.PermissionService
}

func NewPermissionHandler() *PermissionHandler {
	return &PermissionHandler{
		permissionService: system_service.PermissionService{},
	}
}

// CreatePermission 创建权限
// @Summary 创建权限
// @Description 创建新的权限
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param permission body models.PermissionCreateRequest true "权限信息"
// @Success 200 {object} code.Response{data=models.Permission} "创建成功"
// @Failure 400 {object} code.Response "参数错误"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions [post]
func (h *PermissionHandler) CreatePermission(c *gin.Context) {
	var req models.PermissionCreateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		code.Respond(c, code.ParamError.WithError(err), nil)
		return
	}

	permission, err := h.permissionService.CreatePermission(&req)
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("创建权限失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, permission)
}

// GetPermission 获取权限详情
// @Summary 获取权限详情
// @Description 根据ID获取权限详情
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "权限ID"
// @Success 200 {object} code.Response{data=models.Permission} "获取成功"
// @Failure 400 {object} code.Response "参数错误"
// @Failure 404 {object} code.Response "权限不存在"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions/{id} [get]
func (h *PermissionHandler) GetPermission(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		code.Respond(c, code.ParamError.WithInfo("无效的权限ID"), nil)
		return
	}

	permission, err := h.permissionService.GetPermissionByID(id)
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("获取权限失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, permission)
}

// UpdatePermission 更新权限
// @Summary 更新权限
// @Description 根据ID更新权限信息
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "权限ID"
// @Param permission body models.PermissionUpdateRequest true "权限信息"
// @Success 200 {object} code.Response{data=models.Permission} "更新成功"
// @Failure 400 {object} code.Response "参数错误"
// @Failure 404 {object} code.Response "权限不存在"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions/{id} [put]
func (h *PermissionHandler) UpdatePermission(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		code.Respond(c, code.ParamError.WithInfo("无效的权限ID"), nil)
		return
	}

	var req models.PermissionUpdateRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		code.Respond(c, code.ParamError.WithError(err), nil)
		return
	}

	permission, err := h.permissionService.UpdatePermission(id, &req)
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("更新权限失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, permission)
}

// DeletePermission 删除权限
// @Summary 删除权限
// @Description 根据ID删除权限
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param id path int true "权限ID"
// @Success 200 {object} code.Response "删除成功"
// @Failure 400 {object} code.Response "参数错误"
// @Failure 404 {object} code.Response "权限不存在"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions/{id} [delete]
func (h *PermissionHandler) DeletePermission(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		code.Respond(c, code.ParamError.WithInfo("无效的权限ID"), nil)
		return
	}

	err = h.permissionService.DeletePermission(id)
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("删除权限失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, "删除成功")
}

// GetPermissionList 获取权限列表
// @Summary 获取权限列表
// @Description 分页获取权限列表
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param page query int false "页码" default(1)
// @Param page_size query int false "每页数量" default(10)
// @Param name query string false "权限名称"
// @Param code query string false "权限代码"
// @Param type query string false "权限类型"
// @Param status query int false "状态"
// @Success 200 {object} code.Response{data=models.PermissionListResponse} "获取成功"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions [get]
func (h *PermissionHandler) GetPermissionList(c *gin.Context) {
	var req models.PermissionListRequest
	if err := c.ShouldBindQuery(&req); err != nil {
		code.Respond(c, code.ParamError.WithError(err), nil)
		return
	}

	result, err := h.permissionService.GetPermissionList(&req)
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("获取权限列表失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, result)
}

// GetPermissionTree 获取权限树
// @Summary 获取权限树
// @Description 获取权限树形结构
// @Tags 权限管理
// @Accept json
// @Produce json
// @Success 200 {object} code.Response{data=[]models.PermissionResponse} "获取成功"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions/tree [get]
func (h *PermissionHandler) GetPermissionTree(c *gin.Context) {
	tree, err := h.permissionService.GetPermissionTree()
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("获取权限树失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, tree)
}

// BatchDeletePermissions 批量删除权限
// @Summary 批量删除权限
// @Description 根据ID列表批量删除权限
// @Tags 权限管理
// @Accept json
// @Produce json
// @Param ids body []int64 true "权限ID列表"
// @Success 200 {object} code.Response "删除成功"
// @Failure 400 {object} code.Response "参数错误"
// @Failure 500 {object} code.Response "服务器错误"
// @Router /api/v1/permissions/batch [delete]
func (h *PermissionHandler) BatchDeletePermissions(c *gin.Context) {
	var ids []int64
	if err := c.ShouldBindJSON(&ids); err != nil {
		code.Respond(c, code.ParamError.WithError(err), nil)
		return
	}

	if len(ids) == 0 {
		code.Respond(c, code.ParamError.WithInfo("请选择要删除的权限"), nil)
		return
	}

	err := h.permissionService.BatchDeletePermissions(ids)
	if err != nil {
		code.Respond(c, code.ServerError.WithInfo("批量删除权限失败").WithError(err), nil)
		return
	}

	code.Respond(c, code.Success, "删除成功")
}
